home *** CD-ROM | disk | FTP | other *** search
/ Aminet 46 / Aminet 46 (2001)(GTI - Schatztruhe)[!][Dec 2001].iso / Aminet / text / edit / edt10src.lha / txt / M2Edt.mod < prev    next >
Text File  |  1995-04-10  |  18KB  |  645 lines

  1. (*
  2.   .name       Edt/M2Edt
  3.   .task       ascii text editor, main module
  4.   .release    1.0
  5.   .language   Oberon-2
  6.   .translator Amiga Oberon 3.11
  7.   .system     AmigaOS 2.04/2.1/3.0
  8.   .author     Joachim Barheine
  9.   .address    Hochgrevestraße 3, D-38640 Goslar
  10.   .copyright  (c) 1994 by Joachim Barheine
  11. *)
  12.  
  13. (* .info: 09/04/95, 20:49:25, version 179 *)
  14.  
  15. MODULE M2Edt;   (* main *)
  16.  
  17. IMPORT
  18. (* $IF M2Amiga THEN *)
  19.   RxModula2,
  20. (* $END *)
  21.  
  22. (* $IFNOT Demo THEN *)
  23.   NoGuruRq,
  24. (* $END *)
  25.  
  26.   SYS:= SYSTEM,
  27.   OberonLib,
  28.  
  29.   ASCII,  (* ANSI-keys *)
  30.   Rx:= ERexx,
  31.   Clip:= EClip,
  32.   CN:= CmdNodes,
  33.   Dos,
  34.   Exec,
  35.   EArgs,
  36.   F:= Files,
  37.   GUI,
  38.   I:= Intuition,
  39.   Icon:= EIcon,
  40.   IO:= IOServer,
  41.   K:= Kernel,
  42.   Key:= Keymapping,
  43.   L:= UntracedLists,
  44.   M:= Macro,
  45.   Mn:= Menus,
  46.   P:= EPrint,
  47.   Prj:= EProject,
  48.   Req:= ERequests,
  49.   RxARexx,
  50.   RxConfig,
  51.   RxEdit,
  52.   RxFolds,
  53.   RxPosition,
  54.   RxRequests,
  55.   RxSelection,
  56.   RxTexts,
  57.   RxVars,
  58.   RxWindows,
  59.   S:= Strings,
  60.   Sett:= Settings,
  61.   Str:= StrPool,
  62.   T0:= Texts,
  63.   T:= ETexts,
  64.   Util:= Utility,
  65.   W:= Windows,
  66.   Workbench;
  67.  
  68. TYPE
  69.   Window = UNTRACED POINTER TO WindowDesc;
  70.   WindowDesc = RECORD (Prj.WindowDesc)
  71.     string: ARRAY 512 OF CHAR;
  72.     number, line: LONGINT;
  73.     rexxCmd: ARRAY 512 OF CHAR;
  74.     rexxPrg: ARRAY F.filenameLen OF CHAR;
  75.   END;
  76.  
  77.   Text = Prj.Text;
  78.   TextDesc = Prj.TextDesc;
  79.  
  80. VAR
  81.   w: Window;
  82.   msg: SHORTINT;
  83.   except: BOOLEAN;  (* exception situation *)
  84.  
  85. (* $IF Demo THEN *)
  86.   demo1, demo2: INTEGER;
  87.  
  88. PROCEDURE DemoMsg;
  89.  
  90. BEGIN
  91.   Req.ReqMessage(NIL, "Dieses ist eine eingeschränkte|Demonstrationsversion des ASCII-Editors|(M2)Edt von Joachim Barheine.||Lauffähig bis zum 1.6.95!", "Weiter");
  92. END DemoMsg;
  93. (* $END *)
  94.  
  95. (* -- window methods -- *)
  96.  
  97. PROCEDURE (w: Window) New*;
  98.  
  99. BEGIN
  100.   w.New^;
  101.   w.string:= "";
  102.   w.number:= 0;
  103.   w.line:= 0;
  104.   w.rexxCmd:= "";
  105.   w.rexxPrg:= "";
  106. END New;
  107.  
  108. PROCEDURE (w: Window) NewText* (t: IO.Text);
  109.  
  110. BEGIN
  111.   w.NewText^(t);
  112.   IO.SetItemVal(t, Mn.iconsItem, t.icons);
  113. END NewText;
  114.  
  115. PROCEDURE (w: Window) Open* (t: IO.Text): BOOLEAN;
  116.  
  117. VAR
  118.   done: BOOLEAN;
  119.  
  120. BEGIN
  121.   done:= w.Open^(t);
  122.   IF done THEN IO.SetItemVal(t, Mn.iconsItem, t.icons) END;
  123.   RETURN done;
  124. END Open;
  125.  
  126. (* -- create a new window -- *)
  127.  
  128. (* open a new window *)
  129. PROCEDURE CreateWindow(t: IO.Text): Window;
  130.  
  131. VAR
  132.   new: Window;
  133.  
  134. BEGIN
  135.   NEW(new); new.New;
  136.   IF ~new.Open(t) THEN
  137.     new.Dispose; DISPOSE(new); new:= NIL;
  138.     Req.ReqMessage(NIL, Str.cannotOpenWindow^, Str.cancel^);
  139.   END;
  140.   RETURN new;
  141. END CreateWindow;
  142.  
  143. (* -- open a new text -- *)
  144.  
  145. PROCEDURE OpenFile(filename: ARRAY OF CHAR): Text;
  146.  
  147. VAR
  148.   new: Text;
  149.  
  150. (* $CopyArrays- *)
  151.  
  152. BEGIN
  153.   NEW(new); new.New;
  154.   IF ~new.Open(filename) THEN
  155.     new.Dispose; DISPOSE(new); new:= NIL;
  156.   END;
  157.   RETURN new;
  158. END OpenFile;
  159.  
  160. PROCEDURE CreateText(): Text;
  161.  
  162. VAR
  163.   new: Text;
  164.   name: ARRAY F.nameLen OF CHAR;
  165.  
  166. BEGIN
  167.   NEW(new); new.New;
  168.   F.CreateName(name);
  169.   new.Clear(name);
  170.   RETURN new;
  171. END CreateText;
  172.  
  173. (* -- startup -- *)
  174.  
  175. (* start up the editor *)
  176. PROCEDURE Launch(): BOOLEAN;
  177.  
  178. VAR
  179.   i, num: INTEGER;
  180.  
  181.   PROCEDURE OpenInitial(): BOOLEAN;
  182.  
  183.   BEGIN
  184.     RETURN CreateWindow(CreateText()) # NIL;
  185.   END OpenInitial;
  186.  
  187.   PROCEDURE OpenArg(i: INTEGER): BOOLEAN;
  188.  
  189.   VAR
  190.     t: Text;
  191.  
  192.   BEGIN
  193.     t:= OpenFile(EArgs.from[i]^);
  194.     IF t # NIL THEN
  195.       IF CreateWindow(t) # NIL THEN RETURN TRUE END;
  196.       t.Dispose; DISPOSE(t);
  197.     END;
  198.     RETURN FALSE;
  199.   END OpenArg;
  200.  
  201. BEGIN
  202.   num:= 0;
  203.   FOR i:= 0 TO EArgs.numArgs - 1 DO
  204.     IF OpenArg(i) THEN INC(num) ELSE GUI.Flash END;
  205.   END;
  206.   RETURN (num > 0) OR OpenInitial();
  207. END Launch;
  208.  
  209. (* -- Rexx -- *)
  210.  
  211. (* execute a command string (menus, command mode): return if executed in ARexx mode *)
  212. PROCEDURE ExecRexx(w: W.Window; cmdStr: ARRAY OF CHAR; isFile: BOOLEAN): BOOLEAN;
  213.  
  214.   PROCEDURE QuickExec(): BOOLEAN;
  215.  
  216.   BEGIN
  217.     WITH w: Window DO
  218.       IF Util.Stricmp(cmdStr, Rx.upStr) = 0 THEN
  219.         w.MoveDY(-1);
  220.       ELSIF Util.Stricmp(cmdStr, Rx.downStr) = 0 THEN
  221.         w.MoveDY(1);
  222.       ELSIF Util.Stricmp(cmdStr, Rx.leftStr) = 0 THEN
  223.         w.MoveDX(-1);
  224.       ELSIF Util.Stricmp(cmdStr, Rx.rightStr) = 0 THEN
  225.         w.MoveDX(1);
  226.       ELSIF Util.Stricmp(cmdStr, Rx.moveR1Str) = 0 THEN
  227.         w.SetPos(w.pos + 1);
  228.       ELSIF Util.Stricmp(cmdStr, Rx.moveL1Str) = 0 THEN
  229.         w.SetPos(w.pos - 1);
  230.       ELSIF Util.Stricmp(cmdStr, Rx.deleteStr) = 0 THEN
  231.         w.text(Text).Delete(w.pos, 1);
  232.       ELSIF Util.Stricmp(cmdStr, Rx.delBackStr) = 0 THEN
  233.         IF w.pos > 0 THEN
  234.           w.SetPos(w.pos-1);
  235.           w.text(Text).Delete(w.pos, 1);
  236.         END;
  237.       ELSIF Util.Stricmp(cmdStr, Rx.undoStr) = 0 THEN
  238.         IF RxEdit.UndoQ(w) THEN END;
  239.       ELSIF Util.Stricmp(cmdStr, Rx.redoStr) = 0 THEN
  240.         IF RxEdit.RedoQ(w) THEN END;
  241.       ELSE
  242.         RETURN FALSE;
  243.       END;
  244.       RETURN TRUE;
  245.     END;
  246.   END QuickExec;
  247.  
  248. (* $CopyArrays- *)
  249.  
  250. BEGIN
  251.   IF Sett.recording THEN M.AddCommand(cmdStr, isFile) END;
  252.   RETURN (isFile OR ~QuickExec()) & Rx.Execute(cmdStr, isFile);
  253. END ExecRexx;
  254.  
  255. (* -- input handling -- *)
  256.  
  257. (* $StackChk+ --> recursive *)
  258.  
  259. PROCEDURE* HandleRexx(w: W.Window): SHORTINT;  (* commands return code *)
  260.  
  261. VAR
  262.   msg: SHORTINT;
  263.   replied: BOOLEAN;                         (* msg. already replied? *)
  264.   cmdID: INTEGER;                           (* command ID *)
  265.   date: Dos.Date;
  266.  
  267.   PROCEDURE New(w: Prj.Window);
  268.  
  269.   VAR
  270.     t: Text;
  271.  
  272.   BEGIN
  273.     IF (w.text(Prj.Text).useCount = 1) & (w.text(Prj.Text).changes # 0) THEN
  274.       CASE Prj.ReqSave(w) OF
  275.         0: Rx.SetBoolResult(FALSE);  (* cancel *)
  276.            RETURN;
  277.       | 1: Prj.Save(w);   (* save *)
  278.       | 2: Prj.SaveAs(w); (* save as *)
  279.       | 3: ;              (* no *)
  280.       END;
  281.     END;
  282.     t:= CreateText();
  283.     w.NewText(t);
  284.     Rx.SetBoolResult(TRUE);
  285.   END New;
  286.  
  287.   PROCEDURE NewWindow(VAR w: W.Window);
  288.  
  289.   VAR
  290.     w0: W.Window;
  291.  
  292.   BEGIN
  293.     w0:= CreateWindow(w.text);
  294.     IF w0 # NIL THEN w:= w0 END;
  295.   END NewWindow;
  296.  
  297.   PROCEDURE OpenFile(w: Window);
  298.  
  299.   VAR
  300.     new: Text;
  301.  
  302.   BEGIN
  303.     NEW(new); new.New;
  304.     IF ~RxTexts.Open(w, new) THEN new.Dispose; DISPOSE(new) END;
  305.   END OpenFile;
  306.  
  307.   PROCEDURE RepeatRexx(w: Window; VAR msg: SHORTINT);
  308.  
  309.   BEGIN
  310.     IF (w.rexxCmd # "") & CN.ExecRexx(w, w.rexxCmd, FALSE) THEN
  311.       msg:= CN.HandleRexx(w);
  312.     END;
  313.   END RepeatRexx;
  314.  
  315.   PROCEDURE ReplyMsg;
  316.  
  317.   BEGIN
  318.     IF ~replied THEN
  319.       Rx.ReplyMsg;
  320.       replied:= TRUE;
  321.     END;
  322.   END ReplyMsg;
  323.  
  324.   PROCEDURE CheckRefresh(VAR date: Dos.Date);
  325.  
  326.   VAR
  327.     now: Dos.Date;
  328.  
  329.   BEGIN
  330.     Dos.DateStamp(now);
  331.     IF (now.minute > date.minute)
  332.        OR (now.tick - date.tick > 3 * Dos.ticksPerSecond) THEN
  333.       IO.Refresh;  (* check windows for refreshing *)
  334.       date:= now;
  335.     END;
  336.   END CheckRefresh;
  337.  
  338. BEGIN
  339.   Dos.DateStamp(date);
  340.   msg:= IO.msgLocal;
  341.   WHILE Rx.GetMsg() DO
  342.     replied:= FALSE;
  343.     CheckRefresh(date);
  344.     IF Rx.GetCmdID(cmdID) THEN
  345.       CASE cmdID OF
  346.       | Rx.activateWindow:      RxWindows.ActivateWindow(w);
  347.       | Rx.beginMacro:          RxARexx.BeginMacro(w(Prj.Window));
  348.       | Rx.beginMark:           RxSelection.BeginMark(w);
  349.       | Rx.bottom:              RxPosition.Bottom(w);
  350.       | Rx.busy:                RxWindows.Busy(w);
  351.       | Rx.busyDone:            RxWindows.BusyDone(w);
  352.       | Rx.closeAllFolds:       RxFolds.CloseAllFolds(w);
  353.       | Rx.closeFold:           RxFolds.CloseFold(w);
  354.       | Rx.copy:                RxSelection.Copy(w);
  355.       | Rx.cursorOff:   w.CursorOff;
  356.       | Rx.cursorOn:    w.CursorOn;
  357.       | Rx.cut:                 RxSelection.Cut(w);
  358.       | Rx.delBack:             RxEdit.DelBack(w);
  359.       | Rx.delete:              RxEdit.Delete(w);
  360.       | Rx.delLines:            RxEdit.DelLines(w);
  361.       | Rx.displayBeep  : GUI.Flash;
  362.       | Rx.displayOff   : IO.DisplayOff(w.text);
  363.       | Rx.displayOn    : IO.DisplayOn(w.text);
  364.       | Rx.displayPrefs:        RxConfig.DisplayPrefs(w);
  365.       | Rx.down:                RxPosition.Down(w);
  366.       | Rx.editPrefs:           RxConfig.EditPrefs(w);
  367.       | Rx.endMacro:            RxARexx.EndMacro;
  368.       | Rx.endMark:             RxSelection.EndMark(w);
  369.       | Rx.enterRexx:           ReplyMsg;
  370.                                 RxARexx.EnterRexx(w(Window), w(Window).rexxCmd, msg);
  371.       | Rx.erase:               RxSelection.Erase(w);
  372.       | Rx.execMacro:           ReplyMsg;
  373.                                 RxARexx.ExecMacro;
  374.       | Rx.execRexx:            ReplyMsg;
  375.                                 RxARexx.ExecuteRexx(w(Window), w(Window).rexxPrg, msg);
  376.       | Rx.find:                RxPosition.Find(w(Prj.Window));
  377.       | Rx.first:               RxPosition.First(w);
  378.       | Rx.firstText:           RxTexts.FirstText(w);
  379.       | Rx.firstWindow:         RxWindows.FirstWindow(w);
  380.       | Rx.forceAutosave:       RxTexts.ForceAutosave;
  381.       | Rx.freeMacro:           RxARexx.FreeMacro;
  382.       | Rx.get:                 RxVars.GetVar(w(Prj.Window));
  383.       | Rx.getASCII:            RxEdit.GetASCII(w);
  384.       | Rx.getBookmark:         RxPosition.GetBookmark(w(Prj.Window));
  385.       | Rx.gotoBookmark:        RxPosition.GotoBookmark(w(Prj.Window));
  386.       | Rx.gotoLine:            RxPosition.GotoLine(w, w(Window).line);
  387.       | Rx.information:         RxRequests.Information(w);
  388.       | Rx.insASCII:            RxEdit.InsASCII(w);
  389.       | Rx.insert:              RxEdit.Insert(w);
  390.       | Rx.insertFile:          RxTexts.InsertFile(w);
  391.       | Rx.item:                RxConfig.DefItem;
  392.       | Rx.last:                RxPosition.Last(w);
  393.       | Rx.lastChange:          RxPosition.LastChange(w);
  394.       | Rx.lastText:            RxTexts.LastText(w);
  395.       | Rx.lastWindow:          RxWindows.LastWindow(w);
  396.       | Rx.left:                RxPosition.Left(w);
  397.       | Rx.linkChanges:         RxEdit.LinkChanges(w);
  398.       | Rx.linkChangesDone:     RxEdit.LinkChangesDone(w);
  399.       | Rx.matchBracket:        RxPosition.MatchBracket(w); (* result = success *)
  400.       | Rx.menu:                RxConfig.DefMenu;
  401.       | Rx.move:                RxPosition.Move(w);
  402.       | Rx.new:                 New(w(Prj.Window));
  403.       | Rx.newFold:             RxFolds.NewFold(w);
  404.       | Rx.newWindow:           NewWindow(w);
  405.       | Rx.nextText:            RxTexts.NextText(w);
  406.       | Rx.nextWindow:          RxWindows.NextWindow(w);
  407.       | Rx.open:                OpenFile(w(Window));
  408.       | Rx.openAllFolds:        RxFolds.OpenAllFolds(w);
  409.       | Rx.openFold:            RxFolds.OpenFold(w);
  410.       | Rx.pageDown:            RxPosition.PageDown(w);
  411.       | Rx.pageUp:              RxPosition.PageUp(w);
  412.       | Rx.paste:               RxSelection.Paste(w);
  413.       | Rx.prevText:            RxTexts.PrevText(w);
  414.       | Rx.prevWindow:          RxWindows.PrevWindow(w);
  415.       | Rx.print:               RxTexts.Print(w);
  416.       | Rx.printClip:           RxSelection.PrintClip(w);
  417.       | Rx.quit:                RxWindows.Quit(w, msg);
  418.       | Rx.read:                RxEdit.Read(w);
  419.       | Rx.redo:                RxEdit.Redo(w);
  420.       | Rx.redraw:IO.Draw(w.text);
  421.       | Rx.repeatRexx:          ReplyMsg;
  422.                                 RepeatRexx(w(Window), msg);
  423.       | Rx.replace:             RxEdit.Replace(w(Prj.Window));  (* result = changes > 0 *)
  424.       | Rx.reqAction:           RxRequests.ReqAction(w);
  425.       | Rx.reqNumber:           RxRequests.ReqNumber(w, w(Window).number);
  426.       | Rx.reqOptions:          RxRequests.ReqOptions(w);
  427.       | Rx.reqChoice:           RxRequests.ReqChoice(w);
  428.       | Rx.reqString:           RxRequests.ReqString(w, w(Window).string);
  429.       | Rx.right:               RxPosition.Right(w);
  430.       | Rx.resolveAllFolds:     RxFolds.ResolveAllFolds(w);
  431.       | Rx.resolveFold:         RxFolds.ResolveFold(w);
  432.       | Rx.save:                (* $IF Demo THEN *) DemoMsg; (* $END *) RxTexts.Save(w);
  433.       | Rx.saveAs:              (* $IF Demo THEN *) DemoMsg; (* $END *) RxTexts.SaveAs(w);
  434.       | Rx.saveClip:            RxSelection.SaveClip(w);
  435.       | Rx.saveMacro:           RxARexx.SaveMacro(w(Prj.Window));
  436.       | Rx.saveSettings:        RxConfig.SaveSettings(w(Prj.Window));
  437.       | Rx.saveTemp:            RxTexts.SaveTemp(w);
  438.       | Rx.screenToBack:I.ScreenToBack(IO.screen);
  439.       | Rx.screenToFront:I.ScreenToFront(IO.screen);
  440.       | Rx.scrollDX:            RxPosition.ScrollDX(w);
  441.       | Rx.scrollDY:            RxPosition.ScrollDY(w);
  442.       | Rx.selectText:          RxTexts.SelectText(w);
  443.       | Rx.selectWindow:        RxWindows.SelectWindow(w);
  444.       | Rx.set:                 RxVars.SetVar(w(Prj.Window));
  445.       | Rx.setBookmark:         RxPosition.SetBookmark(w(Prj.Window));
  446.       | Rx.setKey:              RxConfig.SetKey;
  447.       | Rx.setWindowBox:        RxWindows.SetWindowBox(w);
  448.       | Rx.shiftClip:            RxSelection.ShiftClip(w);
  449.       | Rx.subItem:             RxConfig.DefSubItem;
  450.       | Rx.title:               RxWindows.Title(w);
  451.       | Rx.toLower:             RxEdit.ToLower(w);
  452.       | Rx.top:                 RxPosition.Top(w);
  453.       | Rx.toUpper:             RxEdit.ToUpper(w);
  454.       | Rx.undo:                RxEdit.Undo(w);
  455.       | Rx.unMark:              RxSelection.UnMark(w);
  456.       | Rx.up:                  RxPosition.Up(w);
  457.       | Rx.windowToBack:        RxWindows.WindowToBack(w);
  458.       | Rx.windowToFront:       RxWindows.WindowToFront(w);
  459.       | Rx.wordBegin:           RxPosition.WordBegin(w);
  460.       | Rx.wordEnd:             RxPosition.WordEnd(w);
  461.       | Rx.wordLeft:            RxPosition.WordLeft(w);
  462.       | Rx.wordRight:           RxPosition.WordRight(w);
  463. (* $IF M2Amiga THEN *)
  464.       | Rx.compile:             ReplyMsg;
  465.                                 IF RxModula2.Compile(w(Prj.Window)) THEN
  466.                                   msg:= CN.HandleRexx(w);
  467.                                 END;
  468.       | Rx.link:                ReplyMsg;
  469.                                 IF RxModula2.Link(w(Prj.Window)) THEN
  470.                                   msg:= CN.HandleRexx(w);
  471.                                 END;
  472.       | Rx.make:                RxModula2.Make(w(Prj.Window));
  473.       | Rx.execute:             RxModula2.Execute(w(Prj.Window));
  474.       | Rx.firstError:          RxModula2.FirstError(w(Prj.Window));
  475.       | Rx.gotoError:           RxModula2.GotoError(w(Prj.Window));
  476.       | Rx.loadErrors:          RxModula2.LoadErrors(w(Prj.Window));
  477.       | Rx.nextError:           RxModula2.NextError(w(Prj.Window));
  478.       | Rx.prevError:           RxModula2.PrevError(w(Prj.Window));
  479. (* $END *)
  480.       END;
  481.     END;
  482.     ReplyMsg;
  483.   END;
  484.   RETURN msg;
  485. END HandleRexx;
  486.  
  487. (* $StackChk= *)
  488.  
  489. PROCEDURE HandleApp(): SHORTINT;
  490.  
  491. VAR
  492.   w: L.NodePtr;
  493.   msg: SHORTINT;
  494.   appMsg: Workbench.AppMessagePtr;
  495.   filename: ARRAY F.filenameLen OF CHAR;
  496.   cmd: ARRAY F.filenameLen + 30 OF CHAR;
  497.   a: ARRAY 1 OF LONGINT;
  498.  
  499. BEGIN
  500.   msg:= IO.msgLocal;
  501.   appMsg:= Exec.GetMsg(IO.appPort);
  502.   WHILE appMsg # NIL DO
  503.     w:= IO.windows.head;
  504.     WHILE (w # NIL) & (w(IO.Window).id # appMsg.id) DO w:= w.next END;
  505.     IF (w # NIL) & (appMsg.numArgs > 0)
  506.       & EArgs.WBGetFilename(filename, appMsg.argList[0].lock, appMsg.argList[0].name) THEN
  507.       a[0]:= SYS.ADR(filename);
  508.       K.FormatString(cmd, "'Open \"%s\"'; 'ActivateWindow'", a);
  509.       Exec.ReplyMsg(appMsg);
  510.       IF CN.ExecRexx(w(W.Window), cmd, FALSE) THEN
  511.         msg:= CN.HandleRexx(w(W.Window));
  512.       END;
  513.     ELSE
  514.       Exec.ReplyMsg(appMsg);
  515.     END;
  516.     appMsg:= Exec.GetMsg(IO.appPort);
  517.   END;
  518.   RETURN msg;
  519. END HandleApp;
  520.  
  521. (* execute startup file *)
  522. PROCEDURE Startup(): BOOLEAN;
  523.  
  524. VAR
  525.   done: BOOLEAN;        (* success? *)
  526.   str: ARRAY 256 OF CHAR;
  527.   a: ARRAY 1 OF LONGINT;
  528.  
  529. (* $IF Demo THEN *)
  530.   PROCEDURE CheckDate;
  531.  
  532.   VAR
  533.     d: Dos.Date;
  534.  
  535.   BEGIN
  536.     Dos.DateStamp(d);
  537.     IF d.days < 6250 THEN
  538.       GUI.Flash;
  539.       Req.ReqMessage(NIL, "DEMO: Uhr verstellt/nicht vorhanden?", "Abbrechen");
  540.       HALT(-1);
  541.     ELSIF ABS(3 - d.days) > demo1 * demo2 THEN
  542.       GUI.Flash;
  543.       Req.ReqMessage(NIL, "DEMO: Der 1.6.95 ist vorüber !", "Entscheidung");
  544.       HALT(-1);
  545.     END;
  546.   END CheckDate;
  547. (* $END *)
  548.  
  549. BEGIN
  550.   (* $IF Demo THEN *)
  551.   DemoMsg;
  552.   CheckDate;
  553.   (* $END *)
  554.   done:= ((EArgs.startup # "") & F.Exists(EArgs.startup)
  555.             & CN.ExecRexx(NIL, EArgs.startup, TRUE)
  556.           OR F.Exists(Str.edtStartupLocalFile^)
  557.             & CN.ExecRexx(NIL, Str.edtStartupLocalFile^, TRUE)
  558.           OR F.Exists(Str.edtStartupLocalFileD)
  559.             & CN.ExecRexx(NIL, Str.edtStartupLocalFileD, TRUE)
  560.           OR F.Exists(Str.edtStartupFile^)
  561.             & CN.ExecRexx(NIL, Str.edtStartupFile^, TRUE)
  562.           OR F.Exists(Str.edtStartupFileD)
  563.             & CN.ExecRexx(NIL, Str.edtStartupFileD, TRUE))
  564.           & (CN.HandleRexx(NIL) = IO.msgLocal) & Launch();
  565.   IF done THEN
  566.     RETURN TRUE;
  567.   ELSE
  568.     a[0]:= SYS.ADR(Str.edtStartupFile^);
  569.     K.FormatString(str, Str.noStartupFile^, a);
  570.     Req.ReqMessage(NIL, str, Str.cancel^);
  571.     HALT(K.rcImportantNotFound);
  572.   END;
  573. END Startup;
  574.  
  575. PROCEDURE* CloseProc(w: W.Window): SHORTINT;
  576.  
  577. BEGIN
  578.   w.Busy(Str.quitting^);
  579.   IF Prj.Close(w(Window), FALSE) THEN
  580.     RETURN IO.msgClosed;
  581.   ELSE
  582.     w.BusyDone;
  583.     RETURN IO.msgLocal;
  584.   END;
  585. END CloseProc;
  586.  
  587. (* not enough memory *)
  588. PROCEDURE* OutOfMemProc;
  589.  
  590. BEGIN
  591.   IF Req.ReqAction(NIL, Str.notEnoughMem^, Str.retryQuit^) = 0 THEN
  592.     K.memAlert:= TRUE;
  593.     HALT(K.rcAborted);
  594.   END;
  595. END OutOfMemProc;
  596.  
  597. (* -- main -- *)
  598.  
  599. BEGIN
  600.   except:= TRUE;
  601. (* $IF Demo THEN *)
  602.   demo2:= 13;
  603. (* $END *)
  604.   OberonLib.OutOfMemHandler:= OutOfMemProc;
  605.   CN.ExecRexx:= ExecRexx;
  606.   CN.HandleRexx:= HandleRexx;
  607. (* $IF Demo THEN *)
  608.   demo1:= 489;
  609. (* $END *)
  610.   W.closeProc:= CloseProc;
  611.   IF Startup() THEN
  612.     msg:= W.HandleInput();
  613.     LOOP
  614.       CASE msg OF
  615.         IO.msgQuit    : EXIT;
  616.       | IO.msgClosed  : w:= W.active(Window);
  617.                         w.Dispose; DISPOSE(w);
  618.                         IF IO.NumWindows() = 0 THEN EXIT END;
  619.                         msg:= W.HandleInput();
  620.       | IO.msgRexxCtrl: IF W.active # NIL THEN
  621.                           msg:= CN.HandleRexx(W.active(Window));
  622.                         ELSE
  623.                           Req.ReqMessage(NIL, Str.noActiveWindow^, Str.ok^);
  624.                           msg:= W.HandleInput();
  625.                         END;
  626.       | IO.msgAppCtrl:  msg:= HandleApp();
  627.       ELSE
  628.         msg:= W.HandleInput();
  629.       END;
  630.     END;
  631.   ELSE
  632.     GUI.Flash;   (* very serious or by intention *)
  633.   END;
  634.   except:= FALSE;  (* no exception *)
  635.  
  636. (* $IF Demo THEN *)
  637.   DemoMsg;
  638. (* $END *)
  639.  
  640. CLOSE
  641.   IF except & (IO.NumWindows() > 0) THEN  (* soft. failure, stack ovfl., mem. *)
  642.     WHILE ~Prj.CloseAll(IO.windows.head(Window)) DO END;  (* first window *)
  643.   END;
  644. END M2Edt.
  645.